#include <iostream>
#include <signal.h>
#include <unistd.h>

using namespace std;

void show_sigset(sigset_t *set)
{
    for (int i = 1; i < 32; i++)
    {
        if (sigismember(set, i))
            putchar('1');
        else
            putchar('0');
    }
    puts("");
}

void handler(int signo)
{
    cout << "收到了[" << signo << "]号信号" << endl;
}

/*测试sigset_t操作函数*/
void t_0()
{
    signal(2, handler);

    sigset_t s, p, os;
    sigemptyset(&s);
    sigemptyset(&os);
    sigemptyset(&p);
    // sigaddset(&s, SIGINT);             // 添加2号信号到s里
    // sigaddset(&s, SIGFPE);             // 添加8号信号到s里
    // sigaddset(&s, SIGKILL);            // 添加9号信号到s里
    for (int i = 1; i <= 31; ++i) // 将所有非实时信号添加到s里
        sigaddset(&s, i);
    sigprocmask(SIG_SETMASK, &s, &os); // 设置到当前进程的block位图里
    cout << "原先的block表：";
    show_sigset(&os);
    cout << "改后的block表：";
    show_sigset(&s);

    while (true)
    {
        sigpending(&p); // 读取pending位图
        cout << "当前pending位图：";
        show_sigset(&p);

        sleep(1);
    }
}

int main(void)
{
    cout << "我的pid是【" << getpid() << "】" << endl;
    t_0();
}